export class Maths {


	/**
	 * ...转换时间格式：130秒=02:10；
	 * p1 需要被转换的秒数
	 * @author chu
	 */

	public static ToTime(p1: number): string {
		var str: string = "";
		var fs: string = "";
		var ms: string = "";
		fs = (p1 / 60) < 10 ? "0" + Math.floor(p1 / 60) : Math.floor(p1 / 60) + "";
		ms = p1 % 60 < 10 ? "0" + p1 % 60 : (p1 % 60) + "";
		str = fs + ":" + ms;
		return str;
	}

	/**
	 * 等比缩放
	 * @param	sw 屏幕显示宽
	 * @param	sh 屏幕显示高
	 * @param	diswh 图片原始大小比例 w/h;
	 */
	public static rSize(sw: number, sh: number, diswh: number): Array<number> {

		let bw: number, bh: number, bx: number, by: number;
		let temph: number = sw / diswh;

		bw = temph > sh ? sh * diswh : sw;
		bh = temph > sh ? sh : temph;

		return [bw, bh];//图片等比缩放后的大小

	}

	/**
	 *
	 * @param	p1  需要替换的字符
	 * @param	... args 通配数据
	 * @return  {\d}
	 */
	public static formetString(p1: String, ...args): String {
		//var str:String = "ni_sheng@QQ.com";
		//var reg:RegExp = /^([a-zA-Z0-9_]+)@([a-z]+)\.(com)|(net)|(cn)$/i;
		var len: number = args.length;
		for (var i: number = 0; i < len; i++) {
			var reg: RegExp = new RegExp("\\{" + i + "\\}", "g");
			p1 = p1.replace(reg, args[i]);
		}
		return p1;
	}

	/**
	 * 弧度转角度
	 *  @param	要转化的弧度值
	 *  @return 角度
	 */
	public static raToag(r: number): number {
		return r * 180 / Math.PI;
	}

	/**
	 * 角度转弧度
	 * @param	ag要转化的角度值
	 * @return	弧度
	 */
	public static agTora(ag: number): number {
		return ag * Math.PI / 180;
	}

	/**
	 * 返回两点之间的角度值
	 * @param	s	起点坐标
	 * @param	d 	终点坐标
	 * @return 返回两点之间的角度
	 */
	public static PointToag(s: cc.Vec2 | cc.Vec3, d: cc.Vec2 | cc.Vec3): number {
		return Maths.raToag(Math.atan2((d.y - s.y), (d.x - s.x)));
	}

	/**
	 * @param	speed 速度
	 * @param	s	起点坐标
	 * @param	d 	终点坐标
	 * @return	返回一个数组，w(x),h(y)
	 */
	public static poToHL(speed: number, s: cc.Vec2, d: cc.Vec2): Array<number> {
		return [speed * Math.cos(Maths.agTora(Maths.PointToag(s, d))), speed * Math.sin(Maths.agTora(Maths.PointToag(s, d)))];
	}

	/**
	 *将角度转化为360度以内的角度，这样就不会有负角度存在
		* @param	ag
		* @return
		*/
	public static agToag(ag: number): number {
		var temp: number = ag % 360;
		if (temp < 0) {
			if (Math.abs(temp) < 180) {
				temp = 360 + temp;
			}
			else {
				temp = Math.abs(temp) - 180;
			}
		}
		return temp;
	}

	/**
	 * 二维索引转一维
	 * @param	h当前行
	 * @param	l当前列
	 * @param	ls总共列
	 * @return
	 */
	public static Arr2To1(h: number, l: number, ls: number): number {
		return (h * ls) + l;
	}

	/**
	 * 一维索引转二维
	 * @param	index一维数组的索引
	 * @param	ls总共列
	 * @return h 行和列
	 */
	public static Arr1To2(index: number, ls: number): cc.Vec2 {
		var h: number = Math.floor(index / ls);
		var l: number = Math.floor(index % ls);
		return new cc.Vec2(h, l);
	}

	/**
	 * 坐标获取阵列
	 * @param	x 坐标X
	 * @param	y 坐标Y
	 * @return  x 返回列 y返回行
	 */
	public static getPoint(x: number, y: number, gwh: number): cc.Vec2 {
		return new cc.Vec2(Math.floor(x / gwh), Math.floor(y / gwh));
	}

	/**
	 * 坐标获取阵列一唯索引
	 * @param	x 坐标X
	 * @param	y 坐标Y
	 * @return  index 返回一唯索引
	 */
	public static getIndex(x: number, y: number, gwh: number): number {
		return this.Arr2To1(Math.floor(y / gwh), Math.floor(x / gwh), gwh);
	}

	/**
	 * 字节转换
	 * @param	p1  被转换字节
	 * @param	... args  替换内容
	 * @return  String不足1G返回M不足1M返回KB不足1KB返回b
	 */
	public static toSize(p1: number): string {
		if (p1 < 1024) return p1 + "b";

		var temp: number, str: string = "Kb";
		temp = p1 / 1024;
		if (temp > 1024) {
			str = "M";
			temp = temp / 1024;
		}
		if (temp > 1024) {
			str = "G";
			temp = temp / 1024;
		}
		return temp % 1 > 0.1 ? temp.toFixed(1) + str : temp.toString() + str;
	}

	/**
	 * 计算版本号
	 * @param s
	 */
	public static getVnum(s: string): number {
		var arr: Array<any> = s.split(".");
		return (arr[0] * 1000000) + (arr[1] * 1000) + (arr[2] * 1);
	}

}